package plp.imperative1.command;

import plp.expressions2.expression.Id;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.imperative1.memory.AmbienteCompilacaoImperativa;
import plp.imperative1.memory.AmbienteExecucaoImperativa;
import plp.imperative1.memory.EntradaVaziaException;

public class Notify implements Comando {

    private Id id;
    
    public Notify ( Id id){
        this.id = id;
    }
    
    /**
     * L� da entrada padr�o.
     *
     * @param ambiente o ambiente de execu��o.
     *
     * @return o ambiente depois de modificado pela execu��o
     * do comando read.
     * @throws InterruptedException 
     * @throws MonitorNaoDeclaradoException 
     *
     */    
    public AmbienteExecucaoImperativa executar(AmbienteExecucaoImperativa ambiente) 
        throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, EntradaVaziaException, InterruptedException  {
    	ambiente.getMonitorVariavel(id).notifyAll();
        return ambiente;    
    }   

    /**
     * Realiza a verificacao de tipos da entrada
     *
     * @param ambiente o ambiente de compila��o.
     * @return <code>true</code> se a express�o da entrada est� bem tipada;
     *          <code>false</code> caso contrario.
     */
    public boolean checaTipo(AmbienteCompilacaoImperativa ambiente) 
        throws VariavelNaoDeclaradaException, EntradaVaziaException, VariavelJaDeclaradaException {
    	//TODO: a implementação seria bastante similar ao checaTipo de ID (basta estar declarado no ambiente)
        //return id.getTipo(ambiente).equals(ambiente.getTipoEntrada());
    	return true;
    }

}
